/*
 * DIM-SUM操作系统 -- 位操作实现
 *
 * Copyright (C) 2023 国科础石(重庆)软件有限公司
 *
 * 作者: Dong Peng <w-pengdong@kernelsoft.com>
 *
 * License terms: GNU General Public License (GPL) version 3
 *
 */


#include <asm/barrier.h>
#include <dim-sum/bitops.h>
#include <asm/types.h>
#include <dim-sum/irqflags.h>

/**
 * 原子位操作
 */

/**
 * @param bit 要设置的bit位置
 * @param *p 位图的long数组
 * 
 * 将位图中第bit位设置为1
 * 
*/

void atomic_set_bit(int bit, unsigned long *p)
{
	__op_bit_ord(or, __NOP, bit, p, .aq);
}

void atomic_clear_bit(int bit, unsigned long *p)
{
	__op_bit_ord(and, __NOT, bit, p, .aq);
}

void atomic_change_bit(int bit, unsigned long *p)
{
	__op_bit_ord(xor, __NOP, bit, p, .aq);
}

/**
 * 比较并设置位
 * 如果旧值已经置位，则返回true
 */

int atomic_test_and_set_bit(int bit, unsigned long *p)
{
	return __test_and_op_bit_ord(or, __NOP, bit, p, .aq);
}

int atomic_test_and_clear_bit(int bit, unsigned long *p)
{
	return __test_and_op_bit_ord(and, __NOT, bit, p, .aq);

}

int atomic_test_and_change_bit(int bit, unsigned long *p)
{
	return __test_and_op_bit_ord(xor, __NOP, bit, p, .aq);
}

